package com.aura.common.redis.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.concurrent.TimeUnit;

/**
 * Redis 基础通用操作封装类（适用于所有类型的 key）
 *
 * 包括：过期时间设置、键是否存在、批量删除、模糊查询、重命名等
 *
 * @Author ZJX
 * @Date 2025/7/19 23:52
 * @Version 1.0
 */
@Component
public class RedisBaseService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 设置 key 的过期时间（单位：秒）
     *
     * @param key Redis 键
     * @param timeout 过期时间（秒）
     * @return 是否设置成功
     */
    public Boolean expire(final String key, final long timeout) {
        return redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
    }

    /**
     * 设置 key 的过期时间（可指定时间单位）
     *
     * @param key Redis 键
     * @param timeout 过期时长
     * @param timeUnit 时间单位（如：TimeUnit.MINUTES）
     * @return 是否设置成功
     */
    public Boolean expire(final String key, final long timeout, final TimeUnit timeUnit) {
        return redisTemplate.expire(key, timeout, timeUnit);
    }

    /**
     * 获取 key 的剩余有效时间（单位：秒）
     *
     * @param key Redis 键
     * @return 剩余有效时间；-1 表示永久有效；-2 表示 key 不存在
     */
    public long getExpire(final String key) {
        return redisTemplate.getExpire(key);
    }

    /**
     * 判断 key 是否存在
     *
     * @param key Redis 键
     * @return true=存在；false=不存在
     */
    public Boolean hasKey(final String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 模糊匹配查询 Redis 中的 key（使用 KEYS 命令）
     * 模式说明：
     * * 任意多个字符   → 如 user:*
     * ? 任意单个字符   → 如 user:10?
     * [abc] 指定字符集 → 如 user:[12]
     * [a-z] 字符范围   → 如 user:[a-c]
     *
     * @param pattern 匹配模式
     * @return 匹配到的 key 集合
     */
    public Collection<String> keys(final String pattern) {
        return redisTemplate.keys(pattern);
    }


    /**
     * 重命名 key（key 必须存在）
     *
     * @param oldKey 原 key
     * @param newKey 新 key
     */
    public void renameKey(final String oldKey, final String newKey) {
        redisTemplate.rename(oldKey, newKey);
    }

    /**
     * 删除单个 key
     *
     * @param key Redis 键
     * @return true=删除成功；false=key 不存在
     */
    public boolean deleteObject(final String key) {
        return Boolean.TRUE.equals(redisTemplate.delete(key));
    }

    /**
     * 删除多个 key
     * 说明: delete底层就是批量删除！
     * @param keys 要删除的 key 集合
     * @return true=至少删除一个；false=未删除
     */
    public boolean deleteObject(final Collection<String> keys) {
        return redisTemplate.delete(keys) > 0;
    }

    /**
     * 获取 key 对应的 Redis 数据类型
     *
     * @param key Redis 键
     * @return 类型字符串，如：string、list、zset、hash、set
     */
    public String getKeyType(final String key) {
        return redisTemplate.type(key).code();
    }

}
